﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
using System.Windows;
using CapaPresentacion.Commands;
using Entidades;
using CapaLogica;
using CapaPresentacion.Vistas;
using Microsoft.Win32;
using System.Windows.Media.Imaging;
using System.Transactions;
using System.Collections.ObjectModel;

namespace CapaPresentacion.Controles
{
    class InscribirAlumnoViewModel
    {

        #region Variables de clase

        public event ReiniciarCU ReiniciarCU;

        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;
        private Guid idTurno;
        private DateTime fechaInscripcion;

        private InscripcionCicloLectivo inscripcionCicloLectivo;

        private InscribirAlumno view;
        
        public List<ViewEntity> ListaAlumnos { get; set; }
        public List<ViewEntity> ListaTurnos { get; set; }
        
        #endregion

        #region Propiedades Públicas
        

        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        public Guid IdTurno
        {
            get
            {
                return idTurno;
            }
            set
            {
                idTurno = value;

            }
        }

        public DateTime FechaInscripcion
        {
            get
            {
                return fechaInscripcion;
            }
            set
            {
                fechaInscripcion = value;

            }
        }

        #endregion

        public InscribirAlumnoViewModel() {  }

        public void Inicializar(InscribirAlumno vista)
        {
            this.view = vista;
            this.view.fechaInscripcionAlumno.SelectedDate = DateTime.Now;

            this.saveCommand = new RelayCommand(GuardarInscripcion);
            this.newCommand = new RelayCommand(NuevaInscripcion);
            this.openCommand = new RelayCommand(AbrirInscripcion);

            this.view.AlumnoEditado.Visibility = Visibility.Collapsed;

            ListaTurnos = new InscripcionAlumnoLogica().ObtenerTurnosCicloActual();            

            if (ListaTurnos.Count == 0)
            {

                if (!new CicloLectivoLogica().ValidarAño(DateTime.Now.Year))
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "No existe un ciclo lectivo creado para el año actual");
                    nueva.ShowDialog();

                    this.ReiniciarCU(CasosDeUso.NuevoCicloLectivo);

                }
                else
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "No existen turnos creados para este ciclo lectivo o todos los turnos están llenos");
                    nueva.ShowDialog();

                    this.ReiniciarCU(CasosDeUso.NuevoTurno);
                }

            }
            else
            {
               
                ListaAlumnos = new InscripcionAlumnoLogica().ObtenerAlumnosCicloActual();

                if (ListaAlumnos == null)
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "No existen alumnos disponibles para inscribirse a algun turno");
                    nueva.ShowDialog();
                    this.ReiniciarCU(CasosDeUso.NuevoAlumno);

                }
            }
         }


        public void Inicializar(InscribirAlumno vista, InscripcionCicloLectivo entidad)
        {
            ListaTurnos = new InscripcionAlumnoLogica().ObtenerTurnosCicloActual();
           
            this.view = vista;
            this.inscripcionCicloLectivo = entidad;
            this.idTurno = entidad.IdTurno;
            this.fechaInscripcion = entidad.FechaInscripcion;
            this.saveCommand = new RelayCommand(GuardarInscripcion);
            this.newCommand = new RelayCommand(NuevaInscripcion);
            this.openCommand = new RelayCommand(AbrirInscripcion);

            this.view.lblNombreAlumno.Content = this.inscripcionCicloLectivo.Alumno.ApellidoAlumno + ", " + this.inscripcionCicloLectivo.Alumno.NombreAlumno + " / DNI: " + this.inscripcionCicloLectivo.Alumno.DniAlumno;
            this.view.listaDatos.Visibility = Visibility.Collapsed;
            
        }

        private void AbrirInscripcion(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar una inscripción existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarInscripcionCicloLectivo);
            }
        }

        private void NuevaInscripcion(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea comenzar una nueva inscripción?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.InscribirAlumno);
            }
        }


        private void GuardarInscripcion(Object parameter)
        {

            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {

                try
                {

                    if (this.view.AlumnoEditado.Visibility == Visibility.Visible) // Edicion de Inscripcion
                    {
                        if (this.inscripcionCicloLectivo.Turno.IdTurno != idTurno)
                        {
                            inscripcionCicloLectivo.FechaInscripcion = fechaInscripcion;

                            this.inscripcionCicloLectivo.IdTurno = idTurno;

                            this.inscripcionCicloLectivo.ChangeTracker.State = ObjectState.Modified;

                            new InscripcionAlumnoLogica().Modificar(inscripcionCicloLectivo);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "La inscripción ha sido modificada correctamente");
                            nueva.ShowDialog();

                            this.ReiniciarCU(CasosDeUso.IrMenuPrincipal);
                        }
                        else
                        {
                            VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El alumno ya está inscripto a ese turno");
                            nueva.ShowDialog();

                        }

                    }
                    else      // Nueva inscripcion
                    {

                        if (Validaciones())
                        {

                            foreach (ViewEntity item in this.view.listaDatos.SelectedItems)
                            {

                                InscripcionCicloLectivo nuevaInscripcion = new InscripcionCicloLectivo();
                                nuevaInscripcion.IdInscripcionCicloLectivo = Guid.NewGuid();
                                nuevaInscripcion.LegajoAlumno = item.Id;
                                nuevaInscripcion.IdTurno = idTurno;
                                nuevaInscripcion.FechaInscripcion = fechaInscripcion;
                                nuevaInscripcion.Eliminada = false;

                                new InscripcionAlumnoLogica().Agregar(nuevaInscripcion);
                            }
                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "La inscripción de el/los alumno/s seleccionado/s ha sido creada correctamente");
                            nueva.ShowDialog();

                            if (MessageBox.Show("¿Desea inscribir a otro/a alumno/a?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
                            {

                                this.ReiniciarCU(CasosDeUso.InscribirAlumno);
                            }
                            else
                            {
                                this.ReiniciarCU(CasosDeUso.IrMenuPrincipal);

                            }


                        }

                    }

                }
                catch (Exception)
                {

                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Ha ocurrido un error y la inscripción no se ha guardado");
                    nueva.ShowDialog();

                }
                


            }



        }


        private bool Validaciones()
        {

            if (FechaInscripcion.ToShortDateString() == null || FechaInscripcion.ToShortDateString() == "01/01/0001")
            {                
                this.fechaInscripcion = DateTime.Now;
            }

                    
            if (this.view.listaDatos.SelectedItems.Count == 0)
            {

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Debe seleccionar al menos un alumno a inscribir");
                nueva.ShowDialog();
                return false;
            }

            if (IdTurno == Guid.Empty || IdTurno == null)
            {
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Debe seleccionar un turno");
                nueva.ShowDialog();
                return false;
            }

            return true;
        }

    }
}
